This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(png)
library(readxl)
library(knitr)
library(cowplot)
library(ggplot2)
library(magick)
library(png)
library(readxl)
library(knitr)
library(cowplot)
library(ggplot2)
library(magick)

filename_sample_Combine_pairs <- paste0('C:/Users/Sylvia/Dropbox (Partners HealthCare)/Sylvia_Romanos/scRNASeq/Data/sample_Combine_pairs.xlsx')
sample_Combine_pairs <- read_excel(filename_sample_Combine_pairs)


sample_type = 'PrePostNBM'
integrate_merge = 'Merge'
folder_base_output = paste0('C:/Users/Sylvia/Dropbox (Partners HealthCare)/Sylvia_Romanos/scRNASeq/Code/Output/',integrate_merge ,' All/',sample_type,'/')
  
for (i in 1:22){
  print(i)
  if (sample_Combine_pairs$'Dexa or not'[i] != 'NBM'){
    
    sample_pre = sample_Combine_pairs$'Sample Pre BM'[i]
    sample_post = sample_Combine_pairs$'Sample Post BM'[i]
    
    print(paste0('Dexa ',sample_Combine_pairs$'Dexa or not'[i]))
    print(paste0('Sample Pre:',sample_pre ))
    print(paste0('Sample Pre:',sample_post ))
    
    folder_input_pre = paste0(folder_base_output,'Samples Seperate/',sample_pre,'/Cluster/PCA20/res1/')
    folder_input_post = paste0(folder_base_output,'Samples Seperate/',sample_post,'/Cluster/PCA20/res1/')
    
    filename_umap_pre = paste0(folder_input_pre,'ClusterUmap_PCA20_res1_label.png')
    filename_heatmap_pre = paste0(folder_input_pre,'HeatMap_PCA20_res1_label.png')
    
    filename_umap_post = paste0(folder_input_post,'ClusterUmap_PCA20_res1_label.png')
    filename_heatmap_post = paste0(folder_input_post,'HeatMap_PCA20_res1_label.png')
    
    label_list = c(paste0(sample_pre, ' Pre Dexa ',sample_Combine_pairs$'Dexa or not'[i] ),
                   paste0(sample_post, ' Post Dexa ',sample_Combine_pairs$'Dexa or not'[i] ))
    p1 <- ggdraw() + draw_image(filename_umap_pre, scale = 1) 
    p2 <- ggdraw() + draw_image(filename_umap_post, scale = 1) 
    plot = plot_grid(p1, p2,labels=label_list)
    print(plot)
    
    p1 <- ggdraw() + draw_image(filename_heatmap_pre, scale = 1)
    p2 <- ggdraw() + draw_image(filename_heatmap_post, scale = 1)
    plot = plot_grid(p1, p2,labels=label_list)
    print(plot)


  }else{
    
    sample = sample_Combine_pairs$'Sample Pre BM'[i]

    print(paste0('Dexa ',sample_Combine_pairs$'Dexa or not'[i]))
    print(paste0('Sample: ',sample ))

    folder_input_pre = paste0(folder_base_output,'Samples Seperate/',sample,'/Cluster/PCA20/res1/')

    filename_umap_pre = paste0(folder_input_pre,'ClusterUmap_PCA20_res1_label.png')
    filename_heatmap_pre = paste0(folder_input_pre,'HeatMap_PCA20_res1_label.png')

    label_list = c(paste0(sample, ' ', sample_Combine_pairs$'Dexa or not'[i] ))
    p1 <- ggdraw() + draw_image(filename_umap_pre, scale = 1) 
    p2 <- ggdraw() + draw_image(filename_heatmap_pre, scale = 1) 
    plot = plot_grid(p1, p2,labels=label_list)
    print(plot)
  

  }
      
}
[1] 1
[1] "Dexa No"
[1] "Sample Pre:GL1024BM"
[1] "Sample Pre:GL1290BM"
[1] 2
[1] "Dexa No"
[1] "Sample Pre:GL1110BM"
[1] "Sample Pre:GL1420BM"
[1] 3
[1] "Dexa No"
[1] "Sample Pre:GL1160BM"
[1] "Sample Pre:GL1497BM"
[1] 4
[1] "Dexa Yes"
[1] "Sample Pre:GL1080BM"
[1] "Sample Pre:GL1374BM"
[1] 5
[1] "Dexa Yes"
[1] "Sample Pre:GL1305BM"
[1] "Sample Pre:GL1786BM"
[1] 6
[1] "Dexa Yes"
[1] "Sample Pre:GL1587BM"
[1] "Sample Pre:GL2264BM"
[1] 7
[1] "Dexa Yes"
[1] "Sample Pre:GL1445BM"
[1] "Sample Pre:GL2156BM"
[1] 8
[1] "Dexa Yes"
[1] "Sample Pre:GL1371BM"
[1] "Sample Pre:GL2090BM"
[1] 9
[1] "Dexa Yes"
[1] "Sample Pre:GL1478BM"
[1] "Sample Pre:GL2320BM"
[1] 10
[1] "Dexa Yes"
[1] "Sample Pre:GL2257BM"
[1] "Sample Pre:GL2941BM"
[1] 11
[1] "Dexa Yes"
[1] "Sample Pre:GL1036BM"
[1] "Sample Pre:GL1320BM"
[1] 12
[1] "Dexa Yes"
[1] "Sample Pre:GL1797BM"
[1] "Sample Pre:GL2697BM"
[1] 13
[1] "Dexa NBM"
[1] "Sample: NBM1CD45P"
[1] 14
[1] "Dexa NBM"
[1] "Sample: NBM2CD45P"
[1] 15
[1] "Dexa NBM"
[1] "Sample: NBM3CD45P"
[1] 16
[1] "Dexa NBM"
[1] "Sample: NBM4CD138N"
[1] 17
[1] "Dexa NBM"
[1] "Sample: NBM6CD138N"
[1] 18
[1] "Dexa NBM"
[1] "Sample: NBM7CD138N"
[1] 19
[1] "Dexa NBM"
[1] "Sample: NBM9CD138N"
[1] 20
[1] "Dexa NBM"
[1] "Sample: NBM10CD138N"
[1] 21
[1] "Dexa NBM"
[1] "Sample: NBM11CD138N"
[1] 22
[1] "Dexa NBM"
[1] "Sample: NBM12CD138N"

NA
filename_sample_Combine_pairs <- paste0('C:/Users/Sylvia/Dropbox (Partners HealthCare)/Sylvia_Romanos/scRNASeq/Data/sample_Combine_pairs.xlsx')
sample_Combine_pairs <- read_excel(filename_sample_Combine_pairs)


sample_type = 'PrePost'
integrate_merge = 'Integrate'
folder_base_output = paste0('C:/Users/Sylvia/Dropbox (Partners HealthCare)/Sylvia_Romanos/scRNASeq/Code/Output/',integrate_merge ,' All/',sample_type,'/')
  
for (i in 1:12){
  print(i)
  if (sample_Combine_pairs$'Dexa or not'[i] != 'NBM'){
    
    PCA = 15
    res = 1
    sample_pre = sample_Combine_pairs$'Sample Pre BM'[i]
    sample_post = sample_Combine_pairs$'Sample Post BM'[i]
    
    print(paste0('Dexa ',sample_Combine_pairs$'Dexa or not'[i]))
    print(paste0('Sample Pre:',sample_pre ))
    print(paste0('Sample Pre:',sample_post ))
    
    folder_input_pre = paste0(folder_base_output,'Samples Seperate/',sample_pre,'/Cluster/PCA',PCA,'/res',res,'/')
    folder_input_post = paste0(folder_base_output,'Samples Seperate/',sample_post,'/Cluster/PCA',PCA,'/res',res,'/')
    
    filename_umap_pre = paste0(folder_input_pre,'ClusterUmap_PCA',PCA,'_res',res,'_label.png')
    filename_heatmap_pre = paste0(folder_input_pre,'HeatMap_PCA',PCA,'_res',res,'_label.png')
    
    filename_umap_post = paste0(folder_input_post,'ClusterUmap_PCA',PCA,'_res',res,'_label.png')
    filename_heatmap_post = paste0(folder_input_post,'HeatMap_PCA',PCA,'_res',res,'_label.png')
    
    label_list = c(paste0(sample_pre, ' Pre Dexa ',sample_Combine_pairs$'Dexa or not'[i] ),
                   paste0(sample_post, ' Post Dexa ',sample_Combine_pairs$'Dexa or not'[i] ))
    p1 <- ggdraw() + draw_image(filename_umap_pre, scale = 1) 
    p2 <- ggdraw() + draw_image(filename_umap_post, scale = 1) 
    plot = plot_grid(p1, p2,labels=label_list)
    print(plot)
    
    p1 <- ggdraw() + draw_image(filename_heatmap_pre, scale = 1)
    p2 <- ggdraw() + draw_image(filename_heatmap_post, scale = 1)
    plot = plot_grid(p1, p2,labels=label_list)
    print(plot)


  }else{
    
    sample = sample_Combine_pairs$'Sample Pre BM'[i]

    print(paste0('Dexa ',sample_Combine_pairs$'Dexa or not'[i]))
    print(paste0('Sample: ',sample ))

    folder_input_pre = paste0(folder_base_output,'Samples Seperate/',sample,'/Cluster/PCA20/res1/')

    filename_umap_pre = paste0(folder_input_pre,'ClusterUmap_PCA20_res1_label.png')
    filename_heatmap_pre = paste0(folder_input_pre,'HeatMap_PCA20_res1_label.png')

    label_list = c(paste0(sample, ' ', sample_Combine_pairs$'Dexa or not'[i] ))
    p1 <- ggdraw() + draw_image(filename_umap_pre, scale = 1) 
    p2 <- ggdraw() + draw_image(filename_heatmap_pre, scale = 1) 
    plot = plot_grid(p1, p2,labels=label_list)
    print(plot)
  

  }
      
}
[1] 1
[1] "Dexa No"
[1] "Sample Pre:GL1024BM"
[1] "Sample Pre:GL1290BM"
[1] 2
[1] "Dexa No"
[1] "Sample Pre:GL1110BM"
[1] "Sample Pre:GL1420BM"
[1] 3
[1] "Dexa No"
[1] "Sample Pre:GL1160BM"
[1] "Sample Pre:GL1497BM"
[1] 4
[1] "Dexa Yes"
[1] "Sample Pre:GL1080BM"
[1] "Sample Pre:GL1374BM"
[1] 5
[1] "Dexa Yes"
[1] "Sample Pre:GL1305BM"
[1] "Sample Pre:GL1786BM"
[1] 6
[1] "Dexa Yes"
[1] "Sample Pre:GL1587BM"
[1] "Sample Pre:GL2264BM"
[1] 7
[1] "Dexa Yes"
[1] "Sample Pre:GL1445BM"
[1] "Sample Pre:GL2156BM"
[1] 8
[1] "Dexa Yes"
[1] "Sample Pre:GL1371BM"
[1] "Sample Pre:GL2090BM"
[1] 9
[1] "Dexa Yes"
[1] "Sample Pre:GL1478BM"
[1] "Sample Pre:GL2320BM"
[1] 10
[1] "Dexa Yes"
[1] "Sample Pre:GL2257BM"
[1] "Sample Pre:GL2941BM"
[1] 11
[1] "Dexa Yes"
[1] "Sample Pre:GL1036BM"
[1] "Sample Pre:GL1320BM"
[1] 12
[1] "Dexa Yes"
[1] "Sample Pre:GL1797BM"
[1] "Sample Pre:GL2697BM"

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCmBgYHtyfQ0KbGlicmFyeShwbmcpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KG1hZ2ljaykNCmBgYA0KDQpgYGB7ciwgZHBpPTMwMH0NCg0KZmlsZW5hbWVfc2FtcGxlX0NvbWJpbmVfcGFpcnMgPC0gcGFzdGUwKCdDOi9Vc2Vycy9TeWx2aWEvRHJvcGJveCAoUGFydG5lcnMgSGVhbHRoQ2FyZSkvU3lsdmlhX1JvbWFub3Mvc2NSTkFTZXEvRGF0YS9zYW1wbGVfQ29tYmluZV9wYWlycy54bHN4JykNCnNhbXBsZV9Db21iaW5lX3BhaXJzIDwtIHJlYWRfZXhjZWwoZmlsZW5hbWVfc2FtcGxlX0NvbWJpbmVfcGFpcnMpDQoNCg0Kc2FtcGxlX3R5cGUgPSAnUHJlUG9zdE5CTScNCmludGVncmF0ZV9tZXJnZSA9ICdNZXJnZScNCmZvbGRlcl9iYXNlX291dHB1dCA9IHBhc3RlMCgnQzovVXNlcnMvU3lsdmlhL0Ryb3Bib3ggKFBhcnRuZXJzIEhlYWx0aENhcmUpL1N5bHZpYV9Sb21hbm9zL3NjUk5BU2VxL0NvZGUvT3V0cHV0LycsaW50ZWdyYXRlX21lcmdlICwnIEFsbC8nLHNhbXBsZV90eXBlLCcvJykNCiAgDQpmb3IgKGkgaW4gMToyMil7DQogIHByaW50KGkpDQogIGlmIChzYW1wbGVfQ29tYmluZV9wYWlycyQnRGV4YSBvciBub3QnW2ldICE9ICdOQk0nKXsNCiAgICANCiAgICBzYW1wbGVfcHJlID0gc2FtcGxlX0NvbWJpbmVfcGFpcnMkJ1NhbXBsZSBQcmUgQk0nW2ldDQogICAgc2FtcGxlX3Bvc3QgPSBzYW1wbGVfQ29tYmluZV9wYWlycyQnU2FtcGxlIFBvc3QgQk0nW2ldDQogICAgDQogICAgcHJpbnQocGFzdGUwKCdEZXhhICcsc2FtcGxlX0NvbWJpbmVfcGFpcnMkJ0RleGEgb3Igbm90J1tpXSkpDQogICAgcHJpbnQocGFzdGUwKCdTYW1wbGUgUHJlOicsc2FtcGxlX3ByZSApKQ0KICAgIHByaW50KHBhc3RlMCgnU2FtcGxlIFByZTonLHNhbXBsZV9wb3N0ICkpDQogICAgDQogICAgZm9sZGVyX2lucHV0X3ByZSA9IHBhc3RlMChmb2xkZXJfYmFzZV9vdXRwdXQsJ1NhbXBsZXMgU2VwZXJhdGUvJyxzYW1wbGVfcHJlLCcvQ2x1c3Rlci9QQ0EyMC9yZXMxLycpDQogICAgZm9sZGVyX2lucHV0X3Bvc3QgPSBwYXN0ZTAoZm9sZGVyX2Jhc2Vfb3V0cHV0LCdTYW1wbGVzIFNlcGVyYXRlLycsc2FtcGxlX3Bvc3QsJy9DbHVzdGVyL1BDQTIwL3JlczEvJykNCiAgICANCiAgICBmaWxlbmFtZV91bWFwX3ByZSA9IHBhc3RlMChmb2xkZXJfaW5wdXRfcHJlLCdDbHVzdGVyVW1hcF9QQ0EyMF9yZXMxX2xhYmVsLnBuZycpDQogICAgZmlsZW5hbWVfaGVhdG1hcF9wcmUgPSBwYXN0ZTAoZm9sZGVyX2lucHV0X3ByZSwnSGVhdE1hcF9QQ0EyMF9yZXMxX2xhYmVsLnBuZycpDQogICAgDQogICAgZmlsZW5hbWVfdW1hcF9wb3N0ID0gcGFzdGUwKGZvbGRlcl9pbnB1dF9wb3N0LCdDbHVzdGVyVW1hcF9QQ0EyMF9yZXMxX2xhYmVsLnBuZycpDQogICAgZmlsZW5hbWVfaGVhdG1hcF9wb3N0ID0gcGFzdGUwKGZvbGRlcl9pbnB1dF9wb3N0LCdIZWF0TWFwX1BDQTIwX3JlczFfbGFiZWwucG5nJykNCiAgICANCiAgICBsYWJlbF9saXN0ID0gYyhwYXN0ZTAoc2FtcGxlX3ByZSwgJyBQcmUgRGV4YSAnLHNhbXBsZV9Db21iaW5lX3BhaXJzJCdEZXhhIG9yIG5vdCdbaV0gKSwNCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoc2FtcGxlX3Bvc3QsICcgUG9zdCBEZXhhICcsc2FtcGxlX0NvbWJpbmVfcGFpcnMkJ0RleGEgb3Igbm90J1tpXSApKQ0KICAgIHAxIDwtIGdnZHJhdygpICsgZHJhd19pbWFnZShmaWxlbmFtZV91bWFwX3ByZSwgc2NhbGUgPSAxKSANCiAgICBwMiA8LSBnZ2RyYXcoKSArIGRyYXdfaW1hZ2UoZmlsZW5hbWVfdW1hcF9wb3N0LCBzY2FsZSA9IDEpIA0KICAgIHBsb3QgPSBwbG90X2dyaWQocDEsIHAyLGxhYmVscz1sYWJlbF9saXN0KQ0KICAgIHByaW50KHBsb3QpDQogICAgDQogICAgcDEgPC0gZ2dkcmF3KCkgKyBkcmF3X2ltYWdlKGZpbGVuYW1lX2hlYXRtYXBfcHJlLCBzY2FsZSA9IDEpDQogICAgcDIgPC0gZ2dkcmF3KCkgKyBkcmF3X2ltYWdlKGZpbGVuYW1lX2hlYXRtYXBfcG9zdCwgc2NhbGUgPSAxKQ0KICAgIHBsb3QgPSBwbG90X2dyaWQocDEsIHAyLGxhYmVscz1sYWJlbF9saXN0KQ0KICAgIHByaW50KHBsb3QpDQoNCg0KICB9ZWxzZXsNCiAgICANCiAgICBzYW1wbGUgPSBzYW1wbGVfQ29tYmluZV9wYWlycyQnU2FtcGxlIFByZSBCTSdbaV0NCg0KICAgIHByaW50KHBhc3RlMCgnRGV4YSAnLHNhbXBsZV9Db21iaW5lX3BhaXJzJCdEZXhhIG9yIG5vdCdbaV0pKQ0KICAgIHByaW50KHBhc3RlMCgnU2FtcGxlOiAnLHNhbXBsZSApKQ0KDQogICAgZm9sZGVyX2lucHV0X3ByZSA9IHBhc3RlMChmb2xkZXJfYmFzZV9vdXRwdXQsJ1NhbXBsZXMgU2VwZXJhdGUvJyxzYW1wbGUsJy9DbHVzdGVyL1BDQTIwL3JlczEvJykNCg0KICAgIGZpbGVuYW1lX3VtYXBfcHJlID0gcGFzdGUwKGZvbGRlcl9pbnB1dF9wcmUsJ0NsdXN0ZXJVbWFwX1BDQTIwX3JlczFfbGFiZWwucG5nJykNCiAgICBmaWxlbmFtZV9oZWF0bWFwX3ByZSA9IHBhc3RlMChmb2xkZXJfaW5wdXRfcHJlLCdIZWF0TWFwX1BDQTIwX3JlczFfbGFiZWwucG5nJykNCg0KICAgIGxhYmVsX2xpc3QgPSBjKHBhc3RlMChzYW1wbGUsICcgJywgc2FtcGxlX0NvbWJpbmVfcGFpcnMkJ0RleGEgb3Igbm90J1tpXSApKQ0KICAgIHAxIDwtIGdnZHJhdygpICsgZHJhd19pbWFnZShmaWxlbmFtZV91bWFwX3ByZSwgc2NhbGUgPSAxKSANCiAgICBwMiA8LSBnZ2RyYXcoKSArIGRyYXdfaW1hZ2UoZmlsZW5hbWVfaGVhdG1hcF9wcmUsIHNjYWxlID0gMSkgDQogICAgcGxvdCA9IHBsb3RfZ3JpZChwMSwgcDIsbGFiZWxzPWxhYmVsX2xpc3QpDQogICAgcHJpbnQocGxvdCkNCiAgDQoNCiAgfQ0KICAgICAgDQp9DQogICAgDQpgYGANCg0KYGBge3IsZHBpPTMwMH0NCmZpbGVuYW1lX3NhbXBsZV9Db21iaW5lX3BhaXJzIDwtIHBhc3RlMCgnQzovVXNlcnMvU3lsdmlhL0Ryb3Bib3ggKFBhcnRuZXJzIEhlYWx0aENhcmUpL1N5bHZpYV9Sb21hbm9zL3NjUk5BU2VxL0RhdGEvc2FtcGxlX0NvbWJpbmVfcGFpcnMueGxzeCcpDQpzYW1wbGVfQ29tYmluZV9wYWlycyA8LSByZWFkX2V4Y2VsKGZpbGVuYW1lX3NhbXBsZV9Db21iaW5lX3BhaXJzKQ0KDQoNCnNhbXBsZV90eXBlID0gJ1ByZVBvc3QnDQppbnRlZ3JhdGVfbWVyZ2UgPSAnSW50ZWdyYXRlJw0KZm9sZGVyX2Jhc2Vfb3V0cHV0ID0gcGFzdGUwKCdDOi9Vc2Vycy9TeWx2aWEvRHJvcGJveCAoUGFydG5lcnMgSGVhbHRoQ2FyZSkvU3lsdmlhX1JvbWFub3Mvc2NSTkFTZXEvQ29kZS9PdXRwdXQvJyxpbnRlZ3JhdGVfbWVyZ2UgLCcgQWxsLycsc2FtcGxlX3R5cGUsJy8nKQ0KICANCmZvciAoaSBpbiAxOjEyKXsNCiAgcHJpbnQoaSkNCiAgaWYgKHNhbXBsZV9Db21iaW5lX3BhaXJzJCdEZXhhIG9yIG5vdCdbaV0gIT0gJ05CTScpew0KICAgIA0KICAgIFBDQSA9IDE1DQogICAgcmVzID0gMQ0KICAgIHNhbXBsZV9wcmUgPSBzYW1wbGVfQ29tYmluZV9wYWlycyQnU2FtcGxlIFByZSBCTSdbaV0NCiAgICBzYW1wbGVfcG9zdCA9IHNhbXBsZV9Db21iaW5lX3BhaXJzJCdTYW1wbGUgUG9zdCBCTSdbaV0NCiAgICANCiAgICBwcmludChwYXN0ZTAoJ0RleGEgJyxzYW1wbGVfQ29tYmluZV9wYWlycyQnRGV4YSBvciBub3QnW2ldKSkNCiAgICBwcmludChwYXN0ZTAoJ1NhbXBsZSBQcmU6JyxzYW1wbGVfcHJlICkpDQogICAgcHJpbnQocGFzdGUwKCdTYW1wbGUgUHJlOicsc2FtcGxlX3Bvc3QgKSkNCiAgICANCiAgICBmb2xkZXJfaW5wdXRfcHJlID0gcGFzdGUwKGZvbGRlcl9iYXNlX291dHB1dCwnU2FtcGxlcyBTZXBlcmF0ZS8nLHNhbXBsZV9wcmUsJy9DbHVzdGVyL1BDQScsUENBLCcvcmVzJyxyZXMsJy8nKQ0KICAgIGZvbGRlcl9pbnB1dF9wb3N0ID0gcGFzdGUwKGZvbGRlcl9iYXNlX291dHB1dCwnU2FtcGxlcyBTZXBlcmF0ZS8nLHNhbXBsZV9wb3N0LCcvQ2x1c3Rlci9QQ0EnLFBDQSwnL3JlcycscmVzLCcvJykNCiAgICANCiAgICBmaWxlbmFtZV91bWFwX3ByZSA9IHBhc3RlMChmb2xkZXJfaW5wdXRfcHJlLCdDbHVzdGVyVW1hcF9QQ0EnLFBDQSwnX3JlcycscmVzLCdfbGFiZWwucG5nJykNCiAgICBmaWxlbmFtZV9oZWF0bWFwX3ByZSA9IHBhc3RlMChmb2xkZXJfaW5wdXRfcHJlLCdIZWF0TWFwX1BDQScsUENBLCdfcmVzJyxyZXMsJ19sYWJlbC5wbmcnKQ0KICAgIA0KICAgIGZpbGVuYW1lX3VtYXBfcG9zdCA9IHBhc3RlMChmb2xkZXJfaW5wdXRfcG9zdCwnQ2x1c3RlclVtYXBfUENBJyxQQ0EsJ19yZXMnLHJlcywnX2xhYmVsLnBuZycpDQogICAgZmlsZW5hbWVfaGVhdG1hcF9wb3N0ID0gcGFzdGUwKGZvbGRlcl9pbnB1dF9wb3N0LCdIZWF0TWFwX1BDQScsUENBLCdfcmVzJyxyZXMsJ19sYWJlbC5wbmcnKQ0KICAgIA0KICAgIGxhYmVsX2xpc3QgPSBjKHBhc3RlMChzYW1wbGVfcHJlLCAnIFByZSBEZXhhICcsc2FtcGxlX0NvbWJpbmVfcGFpcnMkJ0RleGEgb3Igbm90J1tpXSApLA0KICAgICAgICAgICAgICAgICAgIHBhc3RlMChzYW1wbGVfcG9zdCwgJyBQb3N0IERleGEgJyxzYW1wbGVfQ29tYmluZV9wYWlycyQnRGV4YSBvciBub3QnW2ldICkpDQogICAgcDEgPC0gZ2dkcmF3KCkgKyBkcmF3X2ltYWdlKGZpbGVuYW1lX3VtYXBfcHJlLCBzY2FsZSA9IDEpIA0KICAgIHAyIDwtIGdnZHJhdygpICsgZHJhd19pbWFnZShmaWxlbmFtZV91bWFwX3Bvc3QsIHNjYWxlID0gMSkgDQogICAgcGxvdCA9IHBsb3RfZ3JpZChwMSwgcDIsbGFiZWxzPWxhYmVsX2xpc3QpDQogICAgcHJpbnQocGxvdCkNCiAgICANCiAgICBwMSA8LSBnZ2RyYXcoKSArIGRyYXdfaW1hZ2UoZmlsZW5hbWVfaGVhdG1hcF9wcmUsIHNjYWxlID0gMSkNCiAgICBwMiA8LSBnZ2RyYXcoKSArIGRyYXdfaW1hZ2UoZmlsZW5hbWVfaGVhdG1hcF9wb3N0LCBzY2FsZSA9IDEpDQogICAgcGxvdCA9IHBsb3RfZ3JpZChwMSwgcDIsbGFiZWxzPWxhYmVsX2xpc3QpDQogICAgcHJpbnQocGxvdCkNCg0KDQogIH1lbHNlew0KICAgIA0KICAgIHNhbXBsZSA9IHNhbXBsZV9Db21iaW5lX3BhaXJzJCdTYW1wbGUgUHJlIEJNJ1tpXQ0KDQogICAgcHJpbnQocGFzdGUwKCdEZXhhICcsc2FtcGxlX0NvbWJpbmVfcGFpcnMkJ0RleGEgb3Igbm90J1tpXSkpDQogICAgcHJpbnQocGFzdGUwKCdTYW1wbGU6ICcsc2FtcGxlICkpDQoNCiAgICBmb2xkZXJfaW5wdXRfcHJlID0gcGFzdGUwKGZvbGRlcl9iYXNlX291dHB1dCwnU2FtcGxlcyBTZXBlcmF0ZS8nLHNhbXBsZSwnL0NsdXN0ZXIvUENBMjAvcmVzMS8nKQ0KDQogICAgZmlsZW5hbWVfdW1hcF9wcmUgPSBwYXN0ZTAoZm9sZGVyX2lucHV0X3ByZSwnQ2x1c3RlclVtYXBfUENBMjBfcmVzMV9sYWJlbC5wbmcnKQ0KICAgIGZpbGVuYW1lX2hlYXRtYXBfcHJlID0gcGFzdGUwKGZvbGRlcl9pbnB1dF9wcmUsJ0hlYXRNYXBfUENBMjBfcmVzMV9sYWJlbC5wbmcnKQ0KDQogICAgbGFiZWxfbGlzdCA9IGMocGFzdGUwKHNhbXBsZSwgJyAnLCBzYW1wbGVfQ29tYmluZV9wYWlycyQnRGV4YSBvciBub3QnW2ldICkpDQogICAgcDEgPC0gZ2dkcmF3KCkgKyBkcmF3X2ltYWdlKGZpbGVuYW1lX3VtYXBfcHJlLCBzY2FsZSA9IDEpIA0KICAgIHAyIDwtIGdnZHJhdygpICsgZHJhd19pbWFnZShmaWxlbmFtZV9oZWF0bWFwX3ByZSwgc2NhbGUgPSAxKSANCiAgICBwbG90ID0gcGxvdF9ncmlkKHAxLCBwMixsYWJlbHM9bGFiZWxfbGlzdCkNCiAgICBwcmludChwbG90KQ0KICANCg0KICB9DQogICAgICANCn0NCmBgYA0KDQoNCg==